home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 1 / ETO Development Tools 1.iso / Essentials / Developer Essentials Jul 90 / Apple II / Programming & Utilities / Apple IIgs APW Intro Prog Src / HP.PAS / WINDOW.PAS.txt < prev   
Encoding:
Text File  |  1987-09-14  |  8.7 KB  |  270 lines

  1. UNIT Window;
  2.  
  3. {+----------------------------------------------------------------------------+
  4.  |                                                                            |
  5.  |         HodgePodge:  An example Apple IIGS Desktop application             |
  6.  |                                                                            |
  7.  |    Written in 65816 assembler and APW C by the Apple IIGS Tools Team       |
  8.  |              Translated to TML Pascal by TML Systems, Inc.                 |
  9.  |  Modified by Ben Koning for "Programmer's Introduction to the Apple IIGS"  |
  10.  |                                                                            |
  11.  |             Copyright (c) 1986-87 by Apple Computer, Inc.                  |
  12.  |                Copyright (c) 1987 by TML Systems, Inc.                     |
  13.  |                                                                            |
  14.  |                     --------------------------------                       |
  15.  |                                                                            |
  16.  |     Pascal UNIT "WINDOW.PAS" : Routines to open and close windows          |
  17.  |                                                                            |
  18.  +----------------------------------------------------------------------------+}
  19.  
  20.  
  21.  
  22. INTERFACE
  23.  
  24. USES
  25.        HPIntfData,         {HodgePodge Apple IIGS Toolbox Interface Units}
  26.        HPIntfProc,
  27.        HPIntfPdos,
  28.  
  29.        Globals,            {HodgePodge Code Units}
  30.        Dialog,
  31.        Paint,
  32.        Font;
  33.  
  34.  
  35.  
  36. procedure DoCloseItem;             {Closes current frontmost window          }
  37. procedure HideAllWindows;          {Closes all windows on the desktop        }
  38. function  OpenWindow : boolean;    {Tries to open a font or picture window   }
  39. procedure SetUpWindows;            {Initialize variables for stacking windows}
  40.  
  41.  
  42.  
  43.  
  44.  
  45. IMPLEMENTATION
  46.  
  47.  
  48.  
  49. VAR
  50.        myWind      :   ParamList;
  51.        Wxoffset    :   integer;
  52.        Wyoffset    :   integer;
  53.        ISizPos     :   Rect;
  54.  
  55.  
  56.  
  57. procedure AdjWind (theWindow: GrafPortPtr);
  58.  
  59.    {Finds the window designated by theWindow and removes it from the
  60.     WindowList and returns the position in the window list where it was
  61.     found.  Private function.}
  62.  
  63.    var  i      : integer;
  64.         theOne : integer;
  65.  
  66.    begin   {of AdjWind}
  67.  
  68.        {Find the index of the grafportptr of the window being deleted:}
  69.        i := firstWind;
  70.        while WindowList [i] <> theWindow do
  71.            Inc (i);
  72.        theOne  := i;
  73.  
  74.        {Remove corresponding item from the WINDOW-menu:}
  75.        if WIndex = 1 then begin                {Last window--special case}
  76.            InsertMItem (@NoWindStr [1],FirstWindItem + theOne,WindowsMenuID);
  77.            SetMenuFlag ($0080,WindowsMenuID);
  78.            DrawMenuBar;
  79.            Wxoffset := 20;
  80.            Wyoffset := 12;
  81.        end;
  82.        DeleteMItem   (FirstWindItem + theOne);
  83.        CalcMenuSize  (0,0,WindowsMenuID);
  84.  
  85.        {Physically delete (scroll) the grafportptr of the ill-fated window:}
  86.        Inc (i);
  87.        while i < LastWind do begin
  88.            WindowList [i - 1] := WindowList [i];
  89.            Inc (i);
  90.        end;
  91.  
  92.        {Renumber the WINDOW-menu items:}
  93.        for i := theOne to LastWind do
  94.            SetMItemID (FirstWindItem+i-1 {new ID}  ,  FirstWindItem+i {old ID});
  95.  
  96.    end;    {of AdjWind}
  97.  
  98.  
  99.  
  100. function DoTheOpen: boolean;
  101.  
  102.    {This function tries to open a window and returns true/false depending on
  103.     its success.}
  104.  
  105.    var theWindow    : GrafPortPtr;
  106.        myDataHandle : WindDataH;
  107.        theMenuStr   : Str255;
  108.  
  109.    begin   {of DoTheOpen}
  110.        DoTheOpen := false;
  111.    
  112.        myDataHandle := WindDataH (NewHandle (sizeof (WindDataRec),
  113.                                              MyMemoryID,
  114.                                              attrLocked + attrFixed,
  115.                                              Ptr (0)));
  116.        if isToolError then
  117.            Exit;
  118.  
  119.        with myWind do begin
  120.            paramLength  := sizeof (ParamList);
  121.            wFrameBits   := $DDA0;
  122.            wRefCon      := longint (myDataHandle);
  123.            SetRect      (wZoom,0,26,620,190);
  124.            wColor       := nil;
  125.            wYOrigin     := 0;
  126.            wXOrigin     := 0;
  127.            wDataH       := 200;
  128.            wDataW       := 640;
  129.            wMaxH        := 200;
  130.            wMaxW        := 640;
  131.            wScrollVer   := 4;
  132.            wScrollHor   := 16;
  133.            wPageVer     := 40;
  134.            wPageHor     := 160;
  135.            wInfoRefCon  := 0;
  136.            wInfoHeight  := 0;
  137.            wFrameDefProc:= nil;
  138.            wInfoDefProc := nil;
  139.            wPlane       := -1;
  140.            wStorage     := nil;
  141.        end;
  142.    
  143.        theMenuStr := concat ('==',
  144.                              myReply.filename,
  145.                              '\N',
  146.                              IntToString (FirstWindItem + WIndex),
  147.                              '\0.');
  148.  
  149.        with myDataHandle^^ do begin
  150.            Name    := myReply.filename;
  151.            MenuStr := theMenuStr;
  152.            MenuID  := FirstWindItem + WIndex;
  153.        end;
  154.  
  155.        if LoWord (Event.wmTaskData) = FontItem then begin
  156.            {We're opening a font window:}
  157.            myWind.wContDefProc := @DispFontWindow;
  158.            with myDataHandle^^ do begin
  159.                flag    := 1;
  160.                theFont := DesiredFont;
  161.                isMono  := isMonoFont;
  162.            end;
  163.            InstallFont (DesiredFont,0);
  164.        end else begin
  165.            {We're opening a picture window:}
  166.            myWind.wContDefProc := @Paint;
  167.            with myDataHandle^^ do begin
  168.                flag := 0;
  169.                pict := PictHndl;
  170.            end;
  171.        end;
  172.  
  173.        with myWind do begin
  174.            wTitle := @myDataHandle^^.Name;
  175.            SetRect (wPosition,Wxoffset + ISizPos.h1,
  176.                               Wyoffset + ISizPos.v1,
  177.                               Wxoffset + ISizPos.h2,
  178.                               Wyoffset + ISizPos.v2);
  179.        end;
  180.  
  181.        Wxoffset := Wxoffset + 20;  {Update globals which offset new window pos}
  182.        Wyoffset := Wyoffset + 12;
  183.        if Wyoffset > 120 then      {Cause stacking effect}
  184.        Wyoffset := 12;
  185.   
  186.        {Now create the window:}
  187.        theWindow := NewWindow      (myWind);
  188.        SetPort                     (theWindow);
  189.        SetOriginMask               ($FFFE,theWindow);
  190.  
  191.        InitCursor;                 {Go back to the arrow cursor}
  192.        DoTheOpen := true;          {Indicate successful completion}
  193.    end;    {of DoTheOpen}
  194.  
  195.  
  196.  
  197. procedure DoCloseItem;
  198.  
  199.    {This procedure closes the frontmost window and deallocates all of its
  200.     associated storage.  NDA windows are supported for when this procedure
  201.     is called by HideAllWindows when exitting HodgePodge.}
  202.  
  203.    var theWindow    : GrafPortPtr;
  204.        myDataHandle : WindDataH;
  205.  
  206.    begin   {of DoCloseItem}
  207.        theWindow := FrontWindow;
  208.        CloseNDAbyWinPtr (theWindow);
  209.        if isToolError then begin                   {It wasn't an NDA window}
  210.            AdjWind       (theWindow);              {Update WINDOW menu}
  211.            myDataHandle  := WindDataH (GetWRefCon (theWindow));
  212.            DisposeHandle (Handle (myDataHandle));  {Deallocate storage}
  213.            CloseWindow   (theWindow);              {Remove the window}
  214.            Dec           (WIndex);                 {Index into window list}
  215.        end;
  216.    end;    {of DoCloseItem}
  217.  
  218.  
  219.  
  220. procedure HideAllWindows;
  221.  
  222.    {Repeatedly call DoCloseItem to close the frontmost window (which has the
  223.     effect of making the next deeper level window the frontmost one) until
  224.     there is no frontmost window anymore; ie, there are no more windows.}
  225.  
  226.    begin   {of HideAllWindows}
  227.        while FrontWindow <> nil do
  228.            DoCloseItem;
  229.    end;    {of HideAllWindows}
  230.  
  231.  
  232.  
  233. function  OpenWindow : boolean;
  234.  
  235.    {Tries to open either a font or picture window, depending on the
  236.     Event.TaskData returned from TaskMaster (which got it from the
  237.     Event Manager).  True/false is returned depending on whether a
  238.     window was actually opened.  Note the way in which the different
  239.     functions are called in the if-then-else structure below.  Each
  240.     function tries to do what its name implies, and the true/false
  241.     result that each returns is used to determine if the next logical
  242.     function should be called.}
  243.  
  244.    begin   {of OpenWindow}
  245.        OpenWindow := false;
  246.        if LoWord (Event.wmTaskData) = FontItem then begin
  247.            if DoChooseFont then
  248.                if DoTheOpen then
  249.                    OpenWindow := true
  250.        end else begin
  251.            if AskUser then
  252.                if DoTheOpen then
  253.                    OpenWindow := true
  254.        end;
  255.    end;    {of OpenWindow}
  256.  
  257.  
  258.  
  259. procedure SetUpWindows;
  260.  
  261.    begin   {of SetUpWindows}
  262.        Wxoffset := 20;                 {Initial window position offset used for}
  263.        Wyoffset := 12;                 {...stacking the windows.}
  264.        SetRect  (ISizPos,10,20,350,80);
  265.    end;    {of SetUpWindows}
  266.  
  267.  
  268.  
  269. END.
  270.